package com.camnter.newlife.adapter;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.EmbossMaskFilter;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Build;
import android.os.Parcel;
import android.provider.Browser;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AlignmentSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.DrawableMarginSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.IconMarginSpan;
import android.text.style.ImageSpan;
import android.text.style.LeadingMarginSpan;
import android.text.style.MaskFilterSpan;
import android.text.style.QuoteSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TabStopSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.camnter.easyrecyclerview.adapter.EasyRecyclerViewAdapter;
import com.camnter.easyrecyclerview.holder.EasyRecyclerViewHolder;
import com.camnter.newlife.R;
import com.camnter.newlife.bean.SpanData;
import com.camnter.newlife.utils.ResourcesUtils;
import com.camnter.newlife.widget.span.ClickableSpanNoUnderline;
/**
* Description:SpanRecyclerAdapter
* Created by:CaMnter
* Time:2015-12-27 13:41
*/
public class SpanRecyclerAdapter extends EasyRecyclerViewAdapter {
private static final int URL_SPAN = 1;
private static final int UNDERLINE_SPAN = 2;
private static final int TYPEFACE_SPAN = 3;
private static final int TEXT_APPERARANCE_SPAN = 4;
private static final int TAB_STOP_SPAN = 5;
private static final int SUPERS_SCRIPT_SPAN = 6;
private static final int SUB_SCRIPT_SPAN = 7;
private static final int STRIKE_THROUGH_SPAN = 8;
private static final int SCALE_X_SPAN = 9;
private static final int STYLE_SPAN = 10;
private static final int RELATIVE_SIZE_SPAN = 11;
private static final int QUOTO_SPAN = 12;
private static final int MASK_FILTER_SPAN = 13;
private static final int LEADING_MARGIN_SPAN = 14;
private static final int IMAGE_SPAN = 15;
private static final int ICON_MARGIN_SPAN = 16;
private static final int FOREGROUND_COLOR_SPAN = 17;
private static final int DRAWABLE_MARGIN_SPAN = 18;
private static final int BULLET_SPAN = 19;
private static final int BACKGROUND_COLOR_SPAN = 20;
private static final int ALIGNMENT_SPAN_STANDARD = 21;
private static final int ABSOLUTE_SIZE_SPAN = 22;
private static final int CLICKABLE_SPAN = 23;
private Activity activity;
public SpanRecyclerAdapter(Activity activity) {
this.activity = activity;
}
@Override public int[] getItemLayouts() {
return new int[] { R.layout.item_span_content, R.layout.item_span_title };
}
@Override
public void onBindRecycleViewHolder(EasyRecyclerViewHolder easyRecyclerViewHolder, int i) {
SpanData spanData = this.getItem(i);
if (spanData == null) return;
int itemType = this.getRecycleViewItemType(i);
switch (itemType) {
case SpanData.CONTENT: {
TextView labelTV = easyRecyclerViewHolder.findViewById(R.id.span_label_tv);
TextView contentTV = easyRecyclerViewHolder.findViewById(R.id.span_content_tv);
if (spanData.getContent() != null) {
this.setSpanContent(labelTV, contentTV, spanData.getContent(), i);
} else {
contentTV.setText("??????");
labelTV.setText("??????");
}
break;
}
}
}
@Override public int getRecycleViewItemType(int i) {
SpanData spanData = this.getItem(i);
return spanData.getType();
}
@SuppressLint("SetTextI18n")
public void setSpanContent(TextView labelTV, TextView contentTV, String content, int position) {
SpannableStringBuilder ssb = new SpannableStringBuilder(content);
String sub = "Save";
int start = content.indexOf("Save");
switch (position) {
case URL_SPAN: {
labelTV.setText("URLSpan");
ssb.setSpan(new URLSpan("https://github.com/CaMnter"), start, sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
// 在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象
contentTV.setMovementMethod(LinkMovementMethod.getInstance());
// 设置点击后的颜色,这里涉及到ClickableSpan的点击背景
contentTV.setHighlightColor(0xff8FABCC);
break;
}
case UNDERLINE_SPAN: {
labelTV.setText("UnderlineSpan");
ssb.setSpan(new UnderlineSpan(), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case TYPEFACE_SPAN: {
labelTV.setText(
"TypefaceSpan ( Examples include \"monospace\", \"serif\", and \"sans-serif\". )");
ssb.setSpan(new TypefaceSpan("serif"), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case TEXT_APPERARANCE_SPAN: {
labelTV.setText("TextAppearanceSpan");
ColorStateList colorStateList;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
colorStateList = this.activity.getColorStateList(
R.color.selector_apperarance_span);
} else {
colorStateList = this.activity.getResources()
.getColorStateList(
R.color.selector_apperarance_span);
}
ssb.setSpan(new TextAppearanceSpan("serif", Typeface.BOLD_ITALIC,
this.activity.getResources()
.getDimensionPixelSize(R.dimen.text_appearance_span),
colorStateList, colorStateList), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case TAB_STOP_SPAN: {
labelTV.setText("TabStopSpan.Standard");
String[] subs = content.split(" ");
ssb = new SpannableStringBuilder();
/**
* TabStopSpan. Standard related to \t and \n
* TabStopSpan.Standard 跟 \t 和 \n 有关系
*/
for (String sub1 : subs) {
ssb.append("\t").append(sub1).append(" ");
ssb.append("\n");
}
ssb.setSpan(new TabStopSpan.Standard(126), 0, ssb.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case SUPERS_SCRIPT_SPAN: {
labelTV.setText("SuperscriptSpan");
ssb.replace(start, start + sub.length(), "Save6");
Parcel parcel = Parcel.obtain();
parcel.writeInt(6);
int sixPosition = ssb.toString().indexOf("6");
ssb.setSpan(new SuperscriptSpan(parcel), sixPosition, sixPosition + 1,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
parcel.recycle();
contentTV.setText(ssb);
break;
}
case SUB_SCRIPT_SPAN: {
labelTV.setText("SubscriptSpan");
ssb.replace(start, start + sub.length(), "Save6");
Parcel parcel = Parcel.obtain();
parcel.writeInt(6);
int sixPosition = ssb.toString().indexOf("6");
ssb.setSpan(new SubscriptSpan(parcel), sixPosition, sixPosition + 1,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
parcel.recycle();
contentTV.setText(ssb);
break;
}
case STRIKE_THROUGH_SPAN: {
labelTV.setText("StrikethroughSpan");
ssb.setSpan(new StrikethroughSpan(), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case SCALE_X_SPAN: {
labelTV.setText("ScaleXSpan");
ssb.setSpan(new ScaleXSpan(2.0f), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case STYLE_SPAN: {
labelTV.setText(
"StyleSpan ( Typeface.NORMAL,Typeface.BOLD,Typeface.ITALIC,Typeface.BOLD_ITALIC ) ");
ssb.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case RELATIVE_SIZE_SPAN: {
labelTV.setText("RelativeSizeSpan");
ssb.setSpan(new RelativeSizeSpan(6.0f), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case QUOTO_SPAN: {
labelTV.setText("QuoteSpan");
ssb.setSpan(new QuoteSpan(0xff000000), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case MASK_FILTER_SPAN: {
labelTV.setText(
"MaskFilterSpan ( BlurMaskFilter EmbossMaskFilter ) \n Activity: android:hardwareAccelerated=\"false\"\n ");
MaskFilterSpan embossMaskFilterSpan = new MaskFilterSpan(
new EmbossMaskFilter(new float[] { 3, 3, 9 }, 3.0f, 12, 16));
ssb.setSpan(embossMaskFilterSpan, start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
String you = "you";
int indexYou = content.indexOf(you);
MaskFilterSpan blurMaskFilterSpan = new MaskFilterSpan(
new BlurMaskFilter(3, BlurMaskFilter.Blur.OUTER));
ssb.setSpan(blurMaskFilterSpan, indexYou, indexYou + you.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case LEADING_MARGIN_SPAN: {
labelTV.setText("LeadingMarginSpan");
ssb.append(" ")
.append(ssb.toString())
.append(ssb.toString())
.append(ssb.toString());
ssb.setSpan(new LeadingMarginSpan.Standard(96, 36), 0, ssb.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case IMAGE_SPAN: {
labelTV.setText("ImageSpan");
ssb.replace(start, start + sub.length(), " Save");
ssb.setSpan(new ImageSpan(this.activity, R.drawable.ic_mm_normal,
ImageSpan.ALIGN_BASELINE), 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case ICON_MARGIN_SPAN: {
labelTV.setText("IconMarginSpan");
Bitmap bitmap = BitmapFactory.decodeResource(this.activity.getResources(),
R.drawable.ic_mm_normal);
ssb.setSpan(new IconMarginSpan(bitmap, 60), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//bitmap.recycle();
contentTV.setText(ssb);
break;
}
case FOREGROUND_COLOR_SPAN: {
labelTV.setText("ForegroundColorSpan");
ssb.setSpan(new ForegroundColorSpan(0xff303F9F), start, start + sub.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
break;
}
case DRAWABLE_MARGIN_SPAN: {
labelTV.setText("DrawableMarginSpan");
ssb.setSpan(new DrawableMarginSpan(
ResourcesUtils.getDrawable(this.activity, R.drawable.ic_mm_normal), 6), 0, 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
break;
}
case BULLET_SPAN: {
labelTV.setText("BulletSpan");
ssb.setSpan(new BulletSpan(66, 0xff303F9F), start, start + sub.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
break;
}
case BACKGROUND_COLOR_SPAN: {
labelTV.setText("BackgroundColorSpan");
String you = "you";
int indexYou = content.indexOf(you);
ssb.setSpan(new BackgroundColorSpan(0x2f303F9F), start, start + sub.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new BackgroundColorSpan(0x2fFF4081), indexYou, indexYou + you.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
break;
}
case ALIGNMENT_SPAN_STANDARD: {
labelTV.setText("AlignmentSpan.Standard");
ssb.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), 0,
ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
break;
}
case ABSOLUTE_SIZE_SPAN: {
labelTV.setText("AbsoluteSizeSpan");
ssb.setSpan(new AbsoluteSizeSpan(26, true), start, start + sub.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
break;
}
case CLICKABLE_SPAN: {
labelTV.setText("ClickableSpan ( Please click \"Save\" )");
SpanClickableSpan spanClickableSpan = new SpanClickableSpan(0xffFF4081,
new ClickableSpanNoUnderline.OnClickListener<SpanClickableSpan>() {
/**
* ClickableSpan被点击
*
* @param widget widget
* @param span span
*/
@Override public void onClick(View widget, SpanClickableSpan span) {
String urlString = span.getUrlString();
if (TextUtils.isEmpty(urlString)) return;
Uri uri = Uri.parse(urlString);
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID,
context.getPackageName());
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w("URLSpan", "Activity was not found for intent, " +
intent.toString());
}
}
});
spanClickableSpan.setUrlString("https://github.com/CaMnter");
ssb.setSpan(spanClickableSpan, start, start + sub.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
contentTV.setText(ssb);
// 在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象
contentTV.setMovementMethod(LinkMovementMethod.getInstance());
// 设置点击后的颜色,这里涉及到ClickableSpan的点击背景
contentTV.setHighlightColor(0x00000000);
break;
}
}
}
private class SpanClickableSpan extends ClickableSpanNoUnderline {
private String urlString;
public SpanClickableSpan(int color, OnClickListener onClickListener) {
super(color, onClickListener);
}
public String getUrlString() {
return urlString;
}
public void setUrlString(String urlString) {
this.urlString = urlString;
}
}
}